package com.ben.multiple.schedule;

import java.time.LocalDateTime;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

/**
 * 定时任务不加 异步注解，都会是同一个线程在依次执行，包括可以动态修改的定时任务。多个定时任务都是用同一个线程，会线程阻塞。
 * 加 异步注解，每次执行都会开启新的线程。可能存在上个执行还没结束，下个任务就已经开始的情况。
 * 定时任务内抛出异常，不会影响下次任务的执行，也不会影响其它定时任务的执行。
 *
 * @author BenJin Yin
 * @date 2021/1/22
 */
//@Component
public class CronMultiAsync {
    static boolean exceptionFlag = true;

    @Scheduled(cron = "*/8 * * * * *")
    public void task1() {
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("task1 : " + LocalDateTime.now() + "==" + Thread.currentThread().getName());
    }

    @Scheduled(cron = "*/8 * * * * *")
    public void task2() {
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("task2 ：" + LocalDateTime.now() + "==" + Thread.currentThread().getName());
    }

    @Async
    @Scheduled(cron = "*/8 * * * * *")
    public void task3() {
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("task3 ：" + LocalDateTime.now() + "==" + Thread.currentThread().getName());
    }

    @Scheduled(cron = "*/8 * * * * *")
    public void task4() {
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("task4 ：" + LocalDateTime.now() + "==" + Thread.currentThread().getName());
        if (exceptionFlag) {
            exceptionFlag = false;
            throw new RuntimeException("异常测试");
        }
    }

}
